﻿using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using StarsAdmin.Core.App;
using StarsAdmin.Core.JWT;

namespace StarsAdmin.Web.Core.Extensions
{
    /// <summary>
    /// Jwt服务
    /// </summary>
    public static class JwtExtension
    {
        public static void AddJwtConfig(this IServiceCollection services)
        {
            // 添加JWT身份验证服务
            services.AddAuthorization(options =>
            {
                //基于声明的角色授权策略
                options.AddPolicyOptions();
            }).AddAuthentication(options =>
            {
                options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                //options.DefaultAuthenticateScheme = nameof(ApiResponseHandler);// 自定义的身份验证
                options.DefaultChallengeScheme = nameof(ApiResponseHandler);// 没有登录401
                options.DefaultForbidScheme = nameof(ApiResponseHandler);// 已登录，但是没有权限403
            })
            .AddJwtBearer(options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters()
                {
                    ValidateAudience = true,// 是否验证Audience（验证之前的token是否失效）
                    ValidAudience = AppConfigs.Jwt.Audience,// 接收者
                    ValidateIssuer = true,// 是否验证Issuer（颁发者）
                    ValidIssuer = AppConfigs.Jwt.Issuer,// 颁发者
                    ValidateLifetime = true,// 是否验证失效时间
                    ValidateIssuerSigningKey = true,// 是否验证SecurityKey
                    IssuerSigningKey = AppConfigs.Jwt.SecurityKey,// 拿到秘钥SecurityKey
                    ClockSkew = TimeSpan.Zero, // 过期时间容错值，解决服务器端时间不同步问题（秒）
                    RequireExpirationTime = true,
                };
            }).AddScheme<AuthenticationSchemeOptions, ApiResponseHandler>(nameof(ApiResponseHandler), option => { });
        }
    }
}